package com.sybil.ot.dominio;

import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "SIL_TRABAJOS_REALIZADOS_OT")
public class TrabajoRealizado implements Serializable {

   private static final long serialVersionUID = 1L;
   protected TrabajoRealizadoPK llave;
   private String descripcion;
   private String tipo;
   private long cantidadHoras;
   private double precio;
   private double descuento;
   private double montoIva;
   private double porcentajeIva;
   private String usuarioCreo;
   private String usuarioModif;
   private OrdenTrabajo ordenTrabajo;

   public TrabajoRealizado() {
   }

   public TrabajoRealizado(TrabajoRealizadoPK llave) {
      this.llave = llave;
   }

   public TrabajoRealizado(String serieOT, int numeroOT, int numeroTrabajoRealizado) {
      this.llave = new TrabajoRealizadoPK(serieOT, numeroOT, numeroTrabajoRealizado);
   }

   public TrabajoRealizado(String serieOT, int numeroOT, int numeroTrabajoRealizado, String tipo) {
      this.llave = new TrabajoRealizadoPK(serieOT, numeroOT, numeroTrabajoRealizado);
      this.tipo = tipo;
   }

   public TrabajoRealizado(TrabajoRealizadoPK llave, String descripcion, String tipo,
           long cantidadHoras, double precio, double descuento, double montoIva, double porcentajeIva) {
      this.llave = llave;
      this.descripcion = descripcion;
      this.tipo = tipo;
      this.cantidadHoras = cantidadHoras;
      this.precio = precio;
      this.descuento = descuento;
      this.montoIva = montoIva;
      this.porcentajeIva = porcentajeIva;
   }

   @EmbeddedId
   @Valid
   public TrabajoRealizadoPK getLlave() {
      return llave;
   }

   public void setLlave(TrabajoRealizadoPK llave) {
      this.llave = llave;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "TROT_CANTIDAD_HORAS")
   public long getCantidadHoras() {
      return cantidadHoras;
   }

   public void setCantidadHoras(long cantidadHoras) {
      this.cantidadHoras = cantidadHoras;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "TROT_PRECIO")
   public double getPrecio() {
      return precio;
   }

   public void setPrecio(double precio) {
      this.precio = precio;
   }

   @Basic(optional = false)
   @Column(name = "TROT_DESCUENTO")
   public double getDescuento() {
      return descuento;
   }

   public void setDescuento(double descuento) {
      this.descuento = descuento;
   }

   @Basic(optional = false)
   @NotNull
   @Column(name = "TROT_MONTO_IVA")
   public double getMontoIva() {
      return montoIva;
   }

   public void setMontoIva(double montoIva) {
      this.montoIva = montoIva;
   }

   @Basic(optional = false)
   @Column(name = "TROT_PORCENTAJE_IVA")
   public double getPorcentajeIva() {
      return porcentajeIva;
   }

   public void setPorcentajeIva(double porcentajeIva) {
      this.porcentajeIva = porcentajeIva;
   }

   @Basic(optional = false)
   @Column(name = "TROT_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   @Column(name = "TROT_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   @Basic(optional = false)
   @Size(min = 1, max = 100, message = "La Descripción debe tener entre 1 y 100 caracteres")
   @Column(name = "TROT_DESCRIPCION")
   public String getDescripcion() {
      return descripcion;
   }

   public void setDescripcion(String descripcion) {
      this.descripcion = descripcion;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 1)
   @Column(name = "TROT_TIPO")
   public String getTipo() {
      return tipo;
   }

   public void setTipo(String tipo) {
      this.tipo = tipo;
   }

   @JoinColumns({
      @JoinColumn(name = "TROT_ORTR_SERIE", referencedColumnName = "ORTR_SERIE", insertable = false, updatable = false),
      @JoinColumn(name = "TROT_ORTR_NUMERO", referencedColumnName = "ORTR_NUMERO", insertable = false, updatable = false)})
   @ManyToOne(optional = false, fetch = FetchType.LAZY)
   public OrdenTrabajo getOrdenTrabajo() {
      return ordenTrabajo;
   }

   public void setOrdenTrabajo(OrdenTrabajo ordenTrabajo) {
      this.ordenTrabajo = ordenTrabajo;
   }

   @Override
   public int hashCode() {
      int hash = 0;
      hash += (llave != null ? llave.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof TrabajoRealizado)) {
         return false;
      }
      TrabajoRealizado other = (TrabajoRealizado) object;
      if ((this.llave == null && other.llave != null) || (this.llave != null && !this.llave.equals(other.llave))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "TrabajoRealizado[ llave=" + llave + " ]";
   }
}
